package extreme.tddscaffold;

public class ItemPriceCalc {
    public enum ItemEnum {
        NORMAL("NORMAL"),
        AGED_BRIE("AGED_BRIE"),
        SULFURAS("SULFURAS"),
        BACKSTAGE_BRIE("BACKSTAGE_BRIE");

        private String name;

        public String getName() {
            return name;
        }

        ItemEnum(String name) {
            this.name = name;
        }
    }

    public static void getItemPrice(Item item) {
        if (ItemEnum.NORMAL.getName().equals(item.getName())) {
            calcNormalPrice(item);
        }

        if (ItemEnum.AGED_BRIE.getName().equals(item.getName())) {
            calcAgedBriePrice(item);
        }

        if (ItemEnum.SULFURAS.getName().equals(item.getName())) {
            calcSulfurasPrice(item);

        }
        if (ItemEnum.BACKSTAGE_BRIE.getName().equals(item.getName())) {
            calcBackstageBriePrice(item);
        }
    }


    private static void calcNormalPrice(Item item) {
        int newPrice = 0;
        if (item.getUpdatedSellIn() > 0) {
            newPrice = item.getQuality() -
                    (item.getSellIn() - item.getUpdatedSellIn());
        } else {
            if (item.getSellIn() > 0) {
                newPrice = item.getQuality() -
                        (item.getSellIn() + 2 * Math.abs(item.getUpdatedSellIn()));
            } else {
                newPrice = item.getQuality() -
                        2 * Math.abs(item.getUpdatedSellIn() - item.getSellIn());
            }
        }
        item.setUpdatedQuality(newPrice >= 0 ? newPrice : 0);
    }

    private static void calcAgedBriePrice(Item item) {
        int newPrice = 0;
        if (item.getUpdatedSellIn() >= 0) {
            newPrice = item.getQuality() +
                    (item.getSellIn() - item.getUpdatedSellIn());
        } else {
            if (item.getSellIn() > 0) {
                newPrice = item.getQuality() +
                        (item.getSellIn() + 2 * Math.abs(item.getUpdatedSellIn()));
            } else {
                newPrice = item.getQuality() +
                        2 * Math.abs(item.getUpdatedSellIn() - item.getSellIn());
            }
        }
        item.setUpdatedQuality(newPrice <= 50 ? newPrice : 50);
    }

    private static void calcSulfurasPrice(Item item) {
        item.setUpdatedQuality(item.getQuality());
    }

    private static void calcBackstageBriePrice(Item item) {
        int newPrice = 0;
        if (item.getUpdatedSellIn() <= 0) {
            item.setUpdatedQuality(newPrice);
            return;
        }

        if (item.getUpdatedSellIn() < 5) {
            if (item.getSellIn() > 5) {
                newPrice = item.getQuality() +
                        (2 * (item.getSellIn() - 5)) + 3 * (5 - item.getUpdatedSellIn());
            } else {
                newPrice = item.getQuality() + 3 * (5 - item.getUpdatedSellIn());
            }
        } else {
            newPrice = item.getQuality() +
                    (2 * (item.getSellIn() - item.getUpdatedSellIn()));
        }
        item.setUpdatedQuality(newPrice <= 50 ? newPrice : 50);

    }
}
